package com.igeek.compus.backend.singleton;

import java.io.Serializable;

/**
 * 懒汉式
 */
public class LazySingleTon implements Serializable {

    // 开始不初始化
    // volatile保证cpu不优化指令
    private static volatile LazySingleTon lazySingleTon = null;

    private LazySingleTon() {

    }

    // synchronized加载方法上，效率低
//    public static synchronized LazySingleTon getInstance() {
//        if(lazySingleTon == null) {
//            try {
//                Thread.sleep(5000);
//                lazySingleTon = new LazySingleTon();
//            }catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//        return lazySingleTon;
//    }

    // double check双重检测锁模式
    public static LazySingleTon getInstance() {
        if (lazySingleTon == null) {
            synchronized (LazySingleTon.class) {
                if(lazySingleTon == null) {
                    // new不是一个原子操作
                    // 1.分配内存空间
                    // 2.执行构造方法，初始化
                    // 3.把这个对象（引用）指向这个内存空间
                    // 123
                    // cpu优化，指令重排序
                    // 132
                    lazySingleTon = new LazySingleTon();
                }
            }
        }
        return lazySingleTon;
    }

}
